// var i;
// var s;
// var c;
// var l = cc._decorator;
// var u = l.ccclass;
// var p = l.property;
// var f = l.menu;
// var d = (l.inspector, l.executeInEditMode);
// var h = l.requireComponent;
// cc.Class.Attr.setClassAttr;
// (c = s || (s = {}))[(c.SPRITE_CHANGE = 0)] = "SPRITE_CHANGE";
// c[(c.CHECK_MARK = 1)] = "CHECK_MARK";
// c[(c.LABEL = 2)] = "LABEL";
// c[(c.NODE_SWITCH = 3)] = "NODE_SWITCH";
// c[(c.OPCITY_CHANGE = 4)] = "OPCITY_CHANGE";
// c[(c.COLOR_CHANGE = 5)] = "COLOR_CHANGE";
// var _ = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t._type = s.SPRITE_CHANGE;
//         t.sprite = null;
//         t.on_Sprite_Frame = null;
//         t.off_Sprite_Frame = null;
//         t.label = null;
//         t.on_Text = "开";
//         t.off_Text = "关";
//         t.checkMark = null;
//         t.on_Node = null;
//         t.off_Node = null;
//         t.target = null;
//         t.on_Opacity = 255;
//         t.off_Opacity = 150;
//         t.on_Color = cc.Color.WHITE;
//         t.off_Color = cc.Color.BLACK;
//         t._isChecked = !0;
//         t.clickEvents = [];
//         t.auto_Switch = !0;
//         t._pressed = !1;
//         return t;
//     }
//     __extends(t, e);
//     Object.defineProperty(t.prototype, "type", {
//         get: function () {
//             return this._type;
//         },
//         set: function (e) {
//             this._type = e;
//             this.checkAttr();
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     Object.defineProperty(t.prototype, "isChecked", {
//         get: function () {
//             return this._isChecked;
//         },
//         set: function (e) {
//             this._isChecked = e;
//             this.checkEvents();
//         },
//         enumerable: !1,
//         configurable: !0
//     });
//     t.prototype.checkAttr = function () {};
//     t.prototype.onLoad = function () {
//         var e = this;
//         this.node.on(
//             "touchstart",
//             function (t) {
//                 if (e.enabledInHierarchy) {
//                     e._pressed = !0;
//                     t.stopPropagation();
//                 }
//             },
//             this
//         );
//         this.node.on(
//             "touchend",
//             function (t) {
//                 if (e.enabledInHierarchy) {
//                     if (e._pressed) {
//                         if (e.auto_Switch) {
//                             e.isChecked = !e.isChecked;
//                         }
//                         cc.Component.EventHandler.emitEvents(e.clickEvents, e);
//                     }
//                     e._pressed = !1;
//                     t.stopPropagation();
//                 }
//             },
//             this
//         );
//         this.node.on(
//             "touchcancel",
//             function (t) {
//                 if (e.enabledInHierarchy) {
//                     e._pressed = !1;
//                     t.stopPropagation();
//                 }
//             },
//             this
//         );
//         this.checkAttr();
//     };
//     t.prototype.fasong_shijian = function () {
//         cc.Component.EventHandler.emitEvents(this.clickEvents, this);
//     };
//     t.prototype.start = function () {
//         this.checkEvents();
//     };
//     t.prototype.checkEvents = function () {
//         var e = this._isChecked;
//         if (this.type == s.SPRITE_CHANGE && this.sprite) {
//             this.sprite.spriteFrame = e ? this.on_Sprite_Frame : this.off_Sprite_Frame;
//         } else {
//             if (this.type == s.LABEL && this.label) {
//                 this.label.string = e ? this.on_Text : this.off_Text;
//             } else {
//                 if (this.type == s.CHECK_MARK && this.checkMark) {
//                     this.checkMark.active = e;
//                 } else {
//                     {
//                         if (this.type == s.NODE_SWITCH) {
//                             if (this.on_Node) {
//                                 this.on_Node.active = e;
//                             }
//                             return void (this.off_Node && (this.off_Node.active = !e));
//                         }
//                         this.type != s.OPCITY_CHANGE
//                             ? this.type != s.COLOR_CHANGE ||
//                               ((this.target || this.node).color = e ? this.on_Color : this.off_Color)
//                             : ((this.target || this.node).opacity = e ? this.on_Opacity : this.off_Opacity);
//                     }
//                 }
//             }
//         }
//     };
//     __decorate(
//         [
//             p({
//                 type: cc.Enum(s)
//             })
//         ],
//         t.prototype,
//         "_type",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Enum(s),
//                 displayName: "开关类型",
//                 serializable: !0
//             })
//         ],
//         t.prototype,
//         "type",
//         null
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Sprite,
//                 displayName: "开关精灵"
//             })
//         ],
//         t.prototype,
//         "sprite",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.SpriteFrame,
//                 displayName: "图片-开"
//             })
//         ],
//         t.prototype,
//         "on_Sprite_Frame",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.SpriteFrame,
//                 displayName: "图片-关"
//             })
//         ],
//         t.prototype,
//         "off_Sprite_Frame",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Label,
//                 displayName: "开关Label"
//             })
//         ],
//         t.prototype,
//         "label",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 displayName: "文字-开"
//             })
//         ],
//         t.prototype,
//         "on_Text",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 displayName: "文字-关"
//             })
//         ],
//         t.prototype,
//         "off_Text",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Node,
//                 displayName: "复选节点"
//             })
//         ],
//         t.prototype,
//         "checkMark",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Node,
//                 displayName: "节点-开"
//             })
//         ],
//         t.prototype,
//         "on_Node",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Node,
//                 displayName: "节点-关"
//             })
//         ],
//         t.prototype,
//         "off_Node",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Node,
//                 displayName: "开关节点"
//             })
//         ],
//         t.prototype,
//         "target",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Integer,
//                 displayName: "透明度-开"
//             })
//         ],
//         t.prototype,
//         "on_Opacity",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Integer,
//                 displayName: "透明度-关"
//             })
//         ],
//         t.prototype,
//         "off_Opacity",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Color,
//                 displayName: "颜色-开"
//             })
//         ],
//         t.prototype,
//         "on_Color",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Color,
//                 displayName: "颜色-关"
//             })
//         ],
//         t.prototype,
//         "off_Color",
//         void 0
//     );
//     __decorate([p], t.prototype, "_isChecked", void 0);
//     __decorate(
//         [
//             p({
//                 displayName: "开关"
//             })
//         ],
//         t.prototype,
//         "isChecked",
//         null
//     );
//     __decorate(
//         [
//             p({
//                 type: cc.Component.EventHandler
//             })
//         ],
//         t.prototype,
//         "clickEvents",
//         void 0
//     );
//     __decorate(
//         [
//             p({
//                 tooltip: "点击后是否自动切换状态"
//             })
//         ],
//         t.prototype,
//         "auto_Switch",
//         void 0
//     );
//     return __decorate([u, f("ToggleCustom/AL_GAME_HUA/ToggleCustom"), d(), h(cc.Button)], t);
// })(cc.Component);
// exports.default = _;


const {
    ccclass: ccClassDecorator,
    property: propDecorator,
    menu: menuDecorator,
    inspector: inspectorDecorator,
    executeInEditMode: executeInEditModeDecorator,
    requireComponent: requireComponentDecorator
} = cc._decorator;

/**
 * @enum {number}
 * @readonly
 */
const SwitchType = {
    SPRITE_CHANGE: 0,
    CHECK_MARK: 1,
    LABEL: 2,
    NODE_SWITCH: 3,
    OPCITY_CHANGE: 4,
    COLOR_CHANGE: 5,
};

/**
 * 自定义开关组件类
 * @class
 * @extends {cc.Component}
 */
@ccClassDecorator
@menuDecorator("ToggleCustom/AL_GAME_HUA/ToggleCustom")
@executeInEditModeDecorator
@requireComponentDecorator(cc.Button)
class ToggleCustom extends cc.Component {
    /**
     * 开关类型
     * @type {SwitchType}
     * @private
     */
    @propDecorator({ type: cc.Enum(SwitchType) })
    _type = SwitchType.SPRITE_CHANGE;

    /**
     * 开关精灵
     * @type {cc.Sprite}
     */
    @propDecorator({ type: cc.Sprite, displayName: "开关精灵" })
    sprite = null;

    /**
     * 开图片
     * @type {cc.SpriteFrame}
     */
    @propDecorator({ type: cc.SpriteFrame, displayName: "图片-开" })
    on_Sprite_Frame = null;
    
    /**
     * 关图片
     * @type {cc.SpriteFrame}
     */
    @propDecorator({ type: cc.SpriteFrame, displayName: "图片-关" })
    off_Sprite_Frame = null;

    /**
     * 开关文字标签
     * @type {cc.Label}
     */
    @propDecorator({ type: cc.Label, displayName: "开关Label" })
    label = null;
    
    /**
     * 文字-开
     * @type {string}
     */
    @propDecorator({ displayName: "文字-开" })
    on_Text = "开";
    
    /**
     * 文字-关
     * @type {string}
     */
    @propDecorator({ displayName: "文字-关" })
    off_Text = "关";
    
    /**
     * 复选节点
     * @type {cc.Node}
     */
    @propDecorator({ type: cc.Node, displayName: "复选节点" })
    checkMark = null;

    /**
     * 节点-开
     * @type {cc.Node}
     */
    @propDecorator({ type: cc.Node, displayName: "节点-开" })
    on_Node = null;

    /**
     * 节点-关
     * @type {cc.Node}
     */
    @propDecorator({ type: cc.Node, displayName: "节点-关" })
    off_Node = null;

    /**
     * 开关节点
     * @type {cc.Node}
     */
    @propDecorator({ type: cc.Node, displayName: "开关节点" })
    target = null;

    /**
     * 透明度-开
     * @type {number}
     */
    @propDecorator({ type: cc.Integer, displayName: "透明度-开" })
    on_Opacity = 255;

    /**
     * 透明度-关
     * @type {number}
     */
    @propDecorator({ type: cc.Integer, displayName: "透明度-关" })
    off_Opacity = 150;

    /**
     * 颜色-开
     * @type {cc.Color}
     */
    @propDecorator({ displayName: "颜色-开" })
    on_Color = cc.Color.WHITE;

    /**
     * 颜色-关
     * @type {cc.Color}
     */
    @propDecorator({ displayName: "颜色-关" })
    off_Color = cc.Color.BLACK;

    /**
     * 是否选中
     * @type {boolean}
     * @private
     */
    @propDecorator
    _isChecked = true;

    /**
     * 点击事件列表
     * @type {cc.Component.EventHandler[]}
     */
    @propDecorator({ type: cc.Component.EventHandler })
    clickEvents = [];

    /**
     * 点击后是否自动切换状态
     * @type {boolean}
     */
    @propDecorator({ tooltip: "点击后是否自动切换状态" })
    auto_Switch = true;

    get type() {
        return this._type;
    }

    set type(value) {
        this._type = value;
        this.checkAttr();
    }

    get isChecked() {
        return this._isChecked;
    }

    set isChecked(value) {
        this._isChecked = value;
        this.checkEvents();
    }

    /**
     * 检查属性
     */
    checkAttr() {}

    /**
     * 组件加载时的处理
     */
    onLoad() {
        this.node.on(
            "touchstart",
            (event) => {
                if (this.enabledInHierarchy) {
                    this._pressed = true;
                    event.stopPropagation();
                }
            },
            this
        );

        this.node.on(
            "touchend",
            (event) => {
                if (this.enabledInHierarchy) {
                    if (this._pressed) {
                        if (this.auto_Switch) {
                            this.isChecked = !this.isChecked;
                        }
                        cc.Component.EventHandler.emitEvents(this.clickEvents, this);
                    }
                    this._pressed = false;
                    event.stopPropagation();
                }
            },
            this
        );

        this.node.on(
            "touchcancel",
            (event) => {
                if (this.enabledInHierarchy) {
                    this._pressed = false;
                    event.stopPropagation();
                }
            },
            this
        );

        this.checkAttr();
    }

    /**
     * 发送事件
     */
    fasong_shijian() {
        cc.Component.EventHandler.emitEvents(this.clickEvents, this);
    }

    /**
     * 组件启动时的处理
     */
    start() {
        this.checkEvents();
    }

    /**
     * 检查事件
     */
    checkEvents() {
        const isChecked = this._isChecked;

        switch (this.type) {
            case SwitchType.SPRITE_CHANGE:
                if (this.sprite) {
                    this.sprite.spriteFrame = isChecked ? this.on_Sprite_Frame : this.off_Sprite_Frame;
                }
                break;
            
            case SwitchType.LABEL:
                if (this.label) {
                    this.label.string = isChecked ? this.on_Text : this.off_Text;
                }
                break;
            
            case SwitchType.CHECK_MARK:
                if (this.checkMark) {
                    this.checkMark.active = isChecked;
                }
                break;
            
            case SwitchType.NODE_SWITCH:
                if (this.on_Node) {
                    this.on_Node.active = isChecked;
                }
                if (this.off_Node) {
                    this.off_Node.active = !isChecked;
                }
                break;

            case SwitchType.OPCITY_CHANGE:
                (this.target || this.node).opacity = isChecked ? this.on_Opacity : this.off_Opacity;
                break;

            case SwitchType.COLOR_CHANGE:
                (this.target || this.node).color = isChecked ? this.on_Color : this.off_Color;
                break;

            default:
                break;
        }
    }
}

exports.default = ToggleCustom;
